package ic.ast;

import ic.ast.decl.*;
import ic.ast.expr.*;
import ic.ast.stmt.*;
import ic.symbols.*;

/**
 * AST visitor interface. Declares methods for visiting each type of AST node.
 * 
 */
public interface Visitor {

	public Object visit(Program program) throws Exception;

	public Object visit(DeclClass icClass) throws Exception;

	public Object visit(DeclField field) throws Exception;

	public Object visit(DeclVirtualMethod method) throws Exception;

	public Object visit(DeclStaticMethod method) throws Exception;

	public Object visit(DeclLibraryMethod method) throws Exception;

	public Object visit(Parameter formal) throws Exception;

	public Object visit(PrimitiveType type) throws Exception;

	public Object visit(ClassType type) throws Exception;

	public Object visit(StmtAssignment assignment) throws Exception;

	public Object visit(StmtCall callStatement) throws Exception;

	public Object visit(StmtReturn returnStatement) throws Exception;

	public Object visit(StmtIf ifStatement) throws Exception;

	public Object visit(StmtWhile whileStatement) throws Exception;

	public Object visit(StmtBreak breakStatement) throws Exception;

	public Object visit(StmtContinue continueStatement) throws Exception;

	public Object visit(StmtBlock statementsBlock) throws Exception;

	public Object visit(LocalVariable localVariable) throws Exception;

	public Object visit(RefVariable location) throws Exception;

	public Object visit(RefField location) throws Exception;

	public Object visit(RefArrayElement location) throws Exception;

	public Object visit(StaticCall call) throws Exception;

	public Object visit(VirtualCall call) throws Exception;

	public Object visit(This thisExpression) throws Exception;

	public Object visit(NewInstance newClass) throws Exception;

	public Object visit(NewArray newArray) throws Exception;

	public Object visit(Length length) throws Exception;

	public Object visit(Literal literal) throws Exception;

	public Object visit(UnaryOp unaryOp) throws Exception;

	public Object visit(BinaryOp binaryOp) throws Exception;

    public Object visit(GlobalSymbolTable table) throws Exception;

    public Object visit(ClassSymbolTable table) throws Exception;

    public Object visit(BlockSymbolTable table) throws Exception;

    public Object visit(MethodSymbolTable table) throws Exception;

    public Object visit(SymbolTable symbolTable) throws Exception;
}
